关于SE16H,你需要知道的事
文 | SAP油瓶哥
前言
最近看了一些文章介绍SE16H这个新的表查询工具,也想自己来测试下SE16H能做什么,跟传统的SE16, SE16N比起来有什么优势。
适用版本
有文章里提到SE16H是在S/4 HANA中才有的,事实上并非如此,即使没有使用S/4 HANA,在ECC6环境下,这个事务码也是可以用的,在TADIR表中可以看到SE16H于2011年就已经包含在组件SAP_APPL中了 (Release 606)。
新功能
数据库连接 | Database connection
这个是SE16H的新字段,通过该字段,可以在ERP系统中查看SAH HANA数据库的表内容而无需使用SAP HANA Studio。
看了下 SAP NOTE 1636416 对这个字段的解释:
在“数据库连接”字段,可以通过搜索帮助(F4)选择可用的的数据库连接
系统使用选中的数据库连接进行访问
当一个数据库连接被选中时,“Table”字段的搜索帮助会显示SAP HANA中可用的表和视图
SE16H仅能检查到数据库的物理连接,SAP HANA中创建的表的定义必须与SAP ERP数据字典定义一致,如果有不一致(比如字段名),SE16H会DUMP。 使用SE16H访问SAP HANA仅适用于1:1复制的表。所有其他的表(比如仅在SAP HANA中新创)必须使用SAP HANA studio进行访问。
如果不填写"数据库连接",SE16H将访问ERP系统的常规数据库,这种情况下,运行时间可能会较长。
也就是说要发挥出SE16H的全部威力,还是要运行在HANA数据库上的。
这个字段的功能,我在现有环境下没有测试成功。
按下F4我可以看到一个数据库连接 HANA_DEV。
但选中后会提示:
应该是说备选的数据库连接这里是不能使用的。因为没有其他合适的数据库连接可以使用,关于这个字段的用法和效果,只有以后再探索了。
2
组查询 | GROUP
和SE16N比起来,SE16H多了一个可以按组去查询的功能。
比如我们可以按会计科目组,成本中心组,内部订单组来查询表数据。
组(或者说集)可以在GS01中进行定义。
比如我定义了一个公司代码的组ZBUKRS。
当我输入ZBUKRS在查询栏里时,就相当于输入了我在组里定义的3个公司代码。
Note 1666911 提供了一个程序RKSE16H_CREATE_SET,这个程序可以方便的将成本中心组,订单组转换成对象编号组,这将大大方便CO模块的一些表查询,比如COEP,我们甚至可以把不同控制范围下的成本中心组,订单组创建在一个对象编号组里。
3
快速计数 | GROUP
SE16H在选择界面一共有两个列叫Group, 这个Group是可以用来按所选字段计数的。
比如我们点击"Number of Entries"得知BSEG表中一共有695,124条数据,但如果我们想知道各个公司代码下分别有多少条数据,就只要勾选上Company code这行的Group, 然后执行:
就可以直观的看到每个公司代码的凭证行项目数:(有没有联想到TAANA?)
再进一步,如果想知道每个公司代码每年的凭证行项目数怎么做呢? 只要再勾上Fiscal这行的Group就搞定了:
是不是非常方便呢?
4
合计 | TOTAL
TOTAL这一列最好配合着GROUP(计数)来使用,当勾上相应的合计字段后,系统就会额外返回对应的合计值。
比如我想知道5010这个公司代码下2016,2017年的会计凭证行项目本币金额和记账货币金额的合计分别是多少:
公司代码填上5010,为Company code和Fiscal year勾上Group。
再为Amount in LC 和 Amount 勾上 Total。
我们就会得到:
假如我们没有勾选Group,效果就是这样:
注意:如果数据量过大,TOTAL后值可能会溢出。
5
排序 | SORT
回到GROUP(计数)的例子,我们看到系统返回的清单是默认升序的:
如果我们给Company code和Fiscal year勾上Sort, 为Company code选择Sort type DES(降序),Fiscal year的Sort type留空。
清单就变成了这样:
需要说明的是SORT需要配合GROUP(计数)来使用。如果仅勾选了SORT,系统也是会帮你把GROUP勾选上的。
6
顺序 | Sequence
还是继续上面的例子,我们看到清单显示的次序是先公司代码,再会计年度,如果我们为Company code和Fiscal year维护上次序号。
我们就会得到这样的清单:
可以看到列顺序变为了先会计年度,再公司代码。
Sequence可以用来控制输出清单中列的次序,比如你一共要输出6个字段,你可以给这6个字段分别填写Sequence值(范围1-99),系统就会按照Sequence值从小到大依次输出。
Sequence不需要配合Group(计数)来使用。
7
最大值,最小值,平均值 | Aggregate
Aggregate仅对数字型字段有效,可用来返回最大/最小/平均值,建议最好配合Group(分组统计)来使用。
注意:Aggregate,Total还有Group(分组统计)这三者对每一个字段来说只能选用一项,如果勾选了任意两者或以上,系统会提示:
8
结果清单钻取 | Drilldown options in the results list
下钻功能的菜单只有在勾选了Group(分组统计)执行后才会出现,比如COEP表,我们按Controlling area和 Year分组统计,右击任一行会看到Drilldown的选项。
说下这几个的区别:
Drilldown/List: 钻取整个清单,不新开窗口
Drilldown/Row: 钻取选中的行,不新开窗口
Dridown/List/New Mode/Value Entry: 钻取整个清单,新开窗口,返回至选择界面
Drilldown/Row/New Mode: 钻取选中的行,新开窗口显示结果清单
Drilldown/Row/New Mode/Value Entry: 钻取选中行数据,新开窗口,返回至选择界面
比如我们选择Drilldown/List把Cost element加到钻取清单中:
清单会变成这样:
这几个的区别自己试一下就会明白。
另外通过菜单Extras > Change settings,可以把结果清单界面的双击功能修改为上面5种钻取效果中的一种。
9
跨表查询 | Outer Join definition
这个是SE16H最吸引我的新功能,也是我花费时间最多去测试的功能。本来想着按照 Abdellah Khebbar 和 Mohamed Talaat 的博文,应该很快就能把功能测通,可我花了3个多小时,反复试验每个按钮,发现不对啊,为什么我输出的行数比我期望的多?又回过头去把NOTE 1636416 看了好多遍后,我发现他们文章中的截图都是有误导性的!也是说照着他们的方法来操作,根本得不到想要的结果。
其实我早就该发现这个的啊,看他们最后的清单截图就应该能发现问题的。
先说Abdellah Khebbar的例子,这位大哥举的是BSEG和BKPF联合查询的例子,很常见,也很实用啊,这样就不用像以前一样,下载完BSEG后,再去vlookup添加BKPF会计凭证头部信息了,可是你这个截图,不对啊,你明明BSEG只需要输出6行记录,但你的图里是12行啊亲。。我相信你的本意是想达到在原来6行行项目信息的基础上添加上头部信息,哎,真是被你这个Layout给搞晕了,我竟然一开始没发现这个问题。
好,再看下Mohamed Talaat这位大哥的,嗯,用的是LFB1和LFA1跨表查询的例子,输入公司代码去把供应商的名称地址信息一起拉出来,也很常见啊,可是,你配的这个图是在搞笑的吗……第一列全是同一个Vendor? 而你匹配到的又是什么鬼?
你们两位大哥在发表博客前,真的有好好测试嘛……
吐槽完毕,下面来跟大家分享下正确的打开方式,首先介绍下Outer Join definition,NOTE中说了好多点,我稍微总结下:
这个功能可以用来实现跨表查询,(比如去读取文本表里的描述);
不建议一次去处理很多数据(会DUMP的);
对Outer Join definition的显示和定义分别有授权检查;
命名上注意不能是数字开头,字母和/开头都可以;
Outer Join definition是一个workbench object, 也是可以用来传输的;
建议每次修改完Outer Join definition,保存后重新进下SE16H,达到清除之前缓存的目的,如果不退出SE16H直接执行,可能会出现奇怪的现象(例如新添加需要输出的字段显示不正确,或者干脆就DUMP)。
下面我们用一个例子来一步步说明如何实现跨表查询,就用BSEG和BKPF跨表查询的例子。
首先Table处填上BSEG,然后点下面的按钮进入Outer Join definition的定义界面:
填上Outer Join definition的名字和描述,点新建按钮继续:
副表名字那里填上BKPF, 勾上Grouping(如果不勾会严重影响运行性能,甚至DUMP),点开Output:
填上期望从BKPF表里输出的字段:
双击BKPF表名,然后点击新建或插入行按钮(一个是向下插入一行,一个是向上插入):
这里就是最关键的一步了,要定义主副表间如何关联起来,正确的做法是用Reference,让公司代码,凭证编号,会计年度这些主键跟BSEG进行关联。如果不这么做,仅仅在这里进行一些常量的限制或不做限制,那就会出现你最后输出的清单条目数比你期望的多的情况!或者你最后出来的清单,每行信息根本对不上。
解释下这里几个Method的用法:
REFERENCE: 参照, 用于参考其他表的字段值。
CONSTANT:常量,注意要填写未转换的值。
STRING:字符串,可以配合后面的Offset, length来对字符串进行截断处理。
SYSTEMVAR: 系统变量,可以引用SYST结构中的字段VARIABLE: 复杂变量,可以使用SE16N_OJ_GET_OBJECT_FROM_OBJNR变量将Object number转换为成本中心号或内部订单号。
点击新建按钮保存下Outer Join definition,下面我们执行下看看效果吧。
这里以查询一张凭证号为例:
接下来我们更进一步,如果我想要在清单里加上成本中心的描述该怎么操作呢?
首先把CSKT添加为第2张副表,然后我们只需要为CSKT再定义关联方式就可以了:
如果我们为CSKT仅维护像如下的一行关联:
最后的结果:
会发现多输出了两行,原因在于CSKT表里对于成本中心的描述维护了两种语言,我们需要对此做出限制:
我们给副表关联关系增加一行语言的限制,只输出中文描述,注意这里用到了常量。
结果:
原来填写常量值时,需要填写CSKT表中未转换的值。
大功告成:
小结
SE16H确实是一个强悍的工具,从某种程度上说,可以代替我们熟悉的SE16、SE16N、SQVI、SQ01、TAANA了。
然而由于它不是真正的做DATA JOIN, 所以如果一次跨表查询大量的数据,不是非常推荐,很容易报性能瓶颈DUMP,还有就是每次修改完Outer join connection后要记得退出重进SE16H这点也比较麻烦。
SAP NOTE给出的典型应用场景是:
比较ERP数据库和HANA数据库一致性
跨控制范围的表查询
参考文章 | SAP NOTE
https://www.linkedin.com/pulse/you-used-use-se16se16n-sqvi-try-se16h-abdellah-khebbari-/
https://blogs.sap.com/2017/12/18/sap-s4-hana-offering-se16h-versus-se11se16nsqvi/
http://sfcn.mohamedtalaat.com/index.php/8-new-sap-s4hana-se16h-forget-about-se16n-se11-sqvi
https://zhuanlan.zhihu.com/p/32260546
SAP NOTE 1636416
SAP NOTE 1666911
关于作者
Inwehub用户名:李乐平,一枚财务出身的油腻的中年SAP从业大叔,3年财务经验,8年SAP甲方经验,现任某服装行业上市公司SAP项目经理。
推荐阅读